package interfaceGraphique;

import generationTache.generationControle.TacheAperiodiqueCo;
import generationTache.generationControle.TachePeriodiqueCo;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * Permet a l'utilisateur de saisir les differents parametres des taches periodiques et aperiodiques
 * @author nicolas rault et matthieu allon
 *
 */
public class FenTacheControle extends JDialog implements ActionListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel Di;
	private JLabel Ci;
	private JLabel Pi;
	private JTextField textDi;
	private JTextField textCi;
	private JTextField textPi;
	private JButton valider;
	private JButton annuler;
	private FenNbTache fenNbTache;
	private FenError fenError;
	private int nbTacheP;
	private int nbTacheAp;
	private ArrayList<generationTache.IGenerationTache> listeTacheP;
	private ArrayList<generationTache.IGenerationTache> listeTacheAp;
	private static FenTacheControle singletonFenTacheControle;
	private int valDi;
	private int valCi;
	private int valPi;
	private int valri;
	private GridLayout border;
	private JPanel pan;
	
	/**
	 * Constructeur de la fenetre
	 */
	private FenTacheControle()
	{
		this.setTitle("Generation des taches periodiques");
		this.setSize(350,120);
		this.setLocationRelativeTo(this.getParent());
		
		valDi = 0;
		valCi = 0;
		valPi = 0;
		valri = 0;
		
		listeTacheP = new ArrayList<generationTache.IGenerationTache>();
		listeTacheAp = new ArrayList<generationTache.IGenerationTache>();
		pan = new JPanel();
		border = new GridLayout(4,2);
		pan.setLayout(border);
		this.add(pan);
		
		//Creation des differents Label et TextField ou ComboBox associés
		Di = new JLabel("Di : ");
		pan.add(Di);
		
		textDi = new JTextField();
		pan.add(textDi);
		
		Ci = new JLabel("Ci : ");
		pan.add(Ci);
		
		textCi = new JTextField();
		pan.add(textCi);
		
		Pi = new JLabel("Pi : ");
		pan.add(Pi);
		
		textPi = new JTextField();
		pan.add(textPi);
		
		valider = new JButton("Valider");
		pan.add(valider);
		valider.addActionListener(this);
		
		annuler = new JButton("Annuler");
		pan.add(annuler);
		annuler.addActionListener(this);
		
		fenNbTache = FenNbTache.getInstance();
		nbTacheP = fenNbTache.recupNbTachePeriodique();
		nbTacheAp = fenNbTache.recupNbTacheAperiodique();
	}
	
	/**
	 * Permet de recuperer la liste des taches periodiques
	 * @return la liste des taches periodiques
	 */
	public ArrayList<generationTache.IGenerationTache> getListeTacheP()
	{
		return listeTacheP;
	}
	
	/**
	 * Permet de recuperer la liste des taches aperiodiques
	 * @return la liste des taches aperiodiques
	 */
	public ArrayList<generationTache.IGenerationTache> getListeTacheAp()
	{
		return listeTacheAp;
	}
	
	/**
	 * Permet d'autoriser une seule creation de la fenetre FenTacheControle.
	 * @return la fenetre FenTacheControle
	 */
	public static FenTacheControle getInstance()
	{
		if(singletonFenTacheControle == null)
		{
			singletonFenTacheControle = new FenTacheControle();
		}
		return singletonFenTacheControle;
	}

	/**
	 * Permet d'assigner une action aux differents evenements survenus sur la fenetre.
	 * @param e evenement recupere par la fenetre
	 */
	public void actionPerformed(ActionEvent e) {
		String bouton = e.getActionCommand();
		if(bouton.equals("Valider")){
			boolean erreur = false;
			if(nbTacheP>0)
			{
				try
				{
					valDi = Integer.parseInt(textDi.getText());
					valCi = Integer.parseInt(textCi.getText());
					valPi = Integer.parseInt(textPi.getText());
				}
				catch(java.lang.NumberFormatException e1)
				{
					fenError = FenError.getInstance("Veuillez entrer un nombre");
					fenError.changeLabel("Veuillez entrer un entier");
					fenError.setVisible(true);
					fenError.setLocation(30, 100);
					erreur = true;
				}
				if((valDi<1 || valCi<1 || valPi<1) && !erreur)
				{
					fenError = FenError.getInstance("Veuillez entrer un nombre");
					fenError.changeLabel("Di,Ci,Pi > 0");
					fenError.setVisible(true);
					fenError.setLocation(30, 100);
					erreur = true;
				}
				if(!erreur)
				{
					textDi.setText("");
					textCi.setText("");
					textPi.setText("");
					fenNbTache = FenNbTache.getInstance();
					listeTacheP.add(new TachePeriodiqueCo(valDi, valCi, valPi, fenNbTache.recupUp()));
					nbTacheP--;
					if(nbTacheP == 0)
					{
						if(nbTacheAp > 0)
						{
							Pi.setText("ri");
							textDi.setEnabled(false);
							this.setTitle("Generation des taches aperiodiques");
						}
						else
						{
							Pi.setText("Pi");
							this.setVisible(false);
							FenChoixOrdoSimul fen = FenChoixOrdoSimul.getInstance();
							fen.setLocation(30, 100);
							fen.setVisible(true);
						}
					}
				}
			}
			else if(nbTacheP == 0)
			{
				try
				{
					
					valCi = Integer.parseInt(textCi.getText());
					valri = Integer.parseInt(textPi.getText());
				}
				catch(java.lang.NumberFormatException e1)
				{
					fenError = FenError.getInstance("Veuillez entrer un nombre");
					fenError.changeLabel("Veuillez entrer un entier");
					fenError.setVisible(true);
					fenError.setLocation(30, 100);
					erreur = true;
				}
				if((valCi<1 || valri<1) && !erreur)
				{
					fenError = FenError.getInstance("Veuillez entrer un nombre");
					fenError.changeLabel("Di,Ci,ri > 0");
					fenError.setVisible(true);
					fenError.setLocation(30, 100);
					erreur = true;
				}
				if(!erreur)
				{
					textDi.setText("");
					textCi.setText("");
					textPi.setText("");
					textDi.setEnabled(true);

					listeTacheAp.add(new TacheAperiodiqueCo(0, valCi, valri, fenNbTache.recupUp()));
					nbTacheAp--;
					if(nbTacheAp == 0)
					{
						Pi.setText("Pi");
						this.setVisible(false);
						FenChoixOrdoSimul fen = FenChoixOrdoSimul.getInstance();
						fen.setLocation(30, 100);
						fen.setVisible(true);
					}
				}
			}
		}
	}
}
